import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";

// 不需要登录就可以访问的路径
const publicPaths = ["/signin", "/signup"];

const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL || "http://localhost:8011";

async function refreshAccessToken(refreshToken: string): Promise<string | null> {
  try {
    console.log('开始刷新 access_token');
    const response = await fetch(`${API_BASE_URL}/api/v1/auth/refresh`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${refreshToken}`
      },
      body: JSON.stringify({ refresh_token: refreshToken })
    });

    if (!response.ok) {
      console.error('刷新 token 请求失败:', response.status);
      return null;
    }

    const data = await response.json();
    console.log('刷新 token 响应:', data);
    
    if (data.access_token) {
      return data.access_token;
    }
    
    return null;
  } catch (error) {
    console.error('刷新 token 时发生错误:', error);
    return null;
  }
}

export async function middleware(request: NextRequest) {
  console.log('=== 中间件开始处理请求 ===');
  console.log('请求路径:', request.nextUrl.pathname);

  // 检查是否是公开路径
  if (publicPaths.includes(request.nextUrl.pathname)) {
    console.log('访问公开路径，直接放行');
    return NextResponse.next();
  }

  // 获取 token
  const accessToken = request.cookies.get('access_token')?.value;
  const refreshToken = request.cookies.get('refresh_token')?.value;

  console.log('Token 状态:', {
    hasAccessToken: !!accessToken,
    hasRefreshToken: !!refreshToken
  });

  // 如果有 access_token，直接放行
  if (accessToken) {
    console.log('存在 access_token，允许访问');
    return NextResponse.next();
  }

  // 如果有 refresh_token，尝试刷新 access_token
  if (refreshToken) {
    console.log('尝试使用 refresh_token 刷新 access_token');
    try {
      const newAccessToken = await refreshAccessToken(refreshToken);
      if (newAccessToken) {
        console.log('成功刷新 access_token');
        const response = NextResponse.next();
        
        // 设置新的 access_token cookie
        response.cookies.set('access_token', newAccessToken, {
          httpOnly: true,
          secure: process.env.NODE_ENV === 'production',
          sameSite: 'strict',
          maxAge: 60 * 60 // 1小时
        });
        
        console.log('已设置新的 access_token cookie');
        return response;
      }
    } catch (error) {
      console.error('刷新 access_token 失败:', error);
    }
  }

  // 检查是否是管理员路由
  const { pathname } = request.nextUrl;
  if (pathname.startsWith('/admin')) {
    // 如果没有token，重定向到登录页
    if (!accessToken) {
      return NextResponse.redirect(new URL('/signin', request.url));
    }
    
    // 这里应该验证用户角色，但由于中间件中无法直接访问数据库
    // 我们可以在页面组件中进行角色验证
    // 这里只做基本的路由保护
  }

  // 如果没有有效的 token，重定向到登录页
  console.log('无有效 token，重定向到登录页');
  return NextResponse.redirect(new URL('/signin', request.url));
}

// 配置需要进行中间件处理的路径
export const config = {
  matcher: [
    /*
     * 匹配所有路径除了:
     * - api (API routes)
     * - _next/static (static files)
     * - _next/image (image optimization files)
     * - favicon.ico (favicon file)
     */
    "/((?!api|_next/static|_next/image|favicon.ico).*)",
  ],
};
